using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace XjjXmm.Infrastructure.ToolKit;

public class FileKit
{
	public static void SpiteFile(string path)
	{
		var rows = 1000;
		var current = 0;
		var index = 1;
		var fileStream = new FileStream(path, FileMode.Open);
		StreamReader sr = new StreamReader(fileStream);

		List<string> lines = new List<string>();
		var line = sr.ReadLine();


		while (line != null)
		{
			current++;
			lines.Add(line);

			line = sr.ReadLine();

			if (current >= rows || line == null)
			{
				File.WriteAllLines($"note/{index.ToString().PadLeft(6, '0')}.txt", lines);
				current = 0;
				lines = new List<string>();
				index++;
			}
		}
	}

	// 声明INI文件的写操作函数 WritePrivateProfileString()
	[System.Runtime.InteropServices.DllImport("kernel32")]
	private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

	// 声明INI文件的读操作函数 GetPrivateProfileString()
	[System.Runtime.InteropServices.DllImport("kernel32")]
	private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);


	/// 写入INI的方法
	public static void INIWrite(string section, string key, string value, string path)
	{
		// section=配置节点名称，key=键名，value=返回键值，path=路径
		WritePrivateProfileString(section, key, value, path);
	}

	//读取INI的方法
	public static string INIRead(string section, string key, string path)
	{
		// 每次从ini中读取多少字节
		System.Text.StringBuilder temp = new System.Text.StringBuilder(255);

		// section=配置节点名称，key=键名，temp=上面，path=路径
		GetPrivateProfileString(section, key, "", temp, 255, path);
		return temp.ToString();

	}

	//删除一个INI文件
	public static void INIDelete(string FilePath)
	{
		File.Delete(FilePath);
	}

	/// <summary>
	/// 取后缀名
	/// </summary>
	/// <param name="filename">文件名</param>
	/// <returns>.gif|.html格式</returns>
	public static string GetExtension(string filename)
	{
		int start = filename.LastIndexOf(".", StringComparison.Ordinal);
		int length = filename.Length;
		string postfix = filename.Substring(start, length - start);
		return postfix;
	}
	
	public static async Task<string> Md5File(string filePath)
	{
		await using var fileStream = new FileStream(filePath, FileMode.Open);

		return await Md5Steam(fileStream);
	}
	
	public static async Task<string> Md5Steam(Stream steam)
	{
		
		using var md5 = MD5.Create();
		var hashBytes = await md5.ComputeHashAsync(steam);
		steam.Seek(0, SeekOrigin.Begin);
		// Convert the byte array to hexadecimal string
		
		return StringKit.ToHexString(hashBytes);
	}

	public static string Md5Byte(byte[] bytes)
	{
		using var md5 = MD5.Create();
		var hashBytes = md5.ComputeHash(bytes);
		
		return StringKit.ToHexString(hashBytes);
    }
}